home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 701-725 / 708 / intuisup / intuisup42.lha / Intuisup / source.lha / Editor / editor.c < prev    next >
C/C++ Source or Header  |  1992-04-22  |  25KB  |  798 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: editor.c
  6.  *    Created ..: Sunday 22-Dec-91 21:22:28
  7.  *    Revision .: 0
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  12.  *
  13.  ****************************************************************************
  14.  *
  15.  *    Editor main display
  16.  *
  17.  * $Revision Header ********************************************************/
  18.  
  19.     /* Includes */
  20.  
  21. #include "includes.h"
  22. #include "defines.h"
  23. #include "imports.h"
  24. #include "protos.h"
  25.  
  26.     /* Defines for editor gadgets */
  27.  
  28. #define FIRST_MODE_GADGET    EDITOR_GADGET_CREATE
  29.  
  30. #define EDITOR_GADGET1_TYPE        GADGET_DATA_TYPE_CYCLE
  31. #define EDITOR_GADGET1_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT)
  32. #define EDITOR_GADGET1_TEXT        "_Type"
  33. #define EDITOR_GADGET1_LEFT_EDGE    (10 + (4 + 1) * 8)
  34. #define EDITOR_GADGET1_TOP_EDGE        5
  35. #define EDITOR_GADGET1_WIDTH        110
  36. #define EDITOR_GADGET1_HEIGHT        15
  37. #define EDITOR_GADGET1_TEXT_ATTR    &topaz80_attr
  38. #define EDITOR_GADGET1_ACTIVE        1
  39. #define EDITOR_GADGET1_TEXT_ARRAY    &template_type_text_array[0]
  40.  
  41. #define EDITOR_GADGET2_TYPE        GADGET_DATA_TYPE_BUTTON
  42. #define EDITOR_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  43. #define EDITOR_GADGET2_LEFT_EDGE    (EDITOR_GADGET1_LEFT_EDGE + EDITOR_GADGET1_WIDTH + 80 + 4 * 8)
  44. #define EDITOR_GADGET2_TOP_EDGE        5
  45. #define EDITOR_GADGET2_WIDTH        ((6 + 3) * 8)
  46. #define EDITOR_GADGET2_HEIGHT        15
  47. #define EDITOR_GADGET2_TEXT        "_Create"
  48. #define EDITOR_GADGET2_TEXT_ATTR    &topaz80_attr
  49.  
  50. #define EDITOR_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  51. #define EDITOR_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  52. #define EDITOR_GADGET3_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE + EDITOR_GADGET2_WIDTH + 10)
  53. #define EDITOR_GADGET3_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  54. #define EDITOR_GADGET3_WIDTH        EDITOR_GADGET2_WIDTH
  55. #define EDITOR_GADGET3_HEIGHT        EDITOR_GADGET2_HEIGHT
  56. #define EDITOR_GADGET3_TEXT        "_Modify"
  57. #define EDITOR_GADGET3_TEXT_ATTR    &topaz80_attr
  58.  
  59. #define EDITOR_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  60. #define EDITOR_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  61. #define EDITOR_GADGET4_LEFT_EDGE    (EDITOR_GADGET3_LEFT_EDGE + EDITOR_GADGET3_WIDTH + 10)
  62. #define EDITOR_GADGET4_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  63. #define EDITOR_GADGET4_WIDTH        EDITOR_GADGET2_WIDTH
  64. #define EDITOR_GADGET4_HEIGHT        EDITOR_GADGET2_HEIGHT
  65. #define EDITOR_GADGET4_TEXT        "C_lone"
  66. #define EDITOR_GADGET4_TEXT_ATTR    &topaz80_attr
  67.  
  68. #define EDITOR_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  69. #define EDITOR_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  70. #define EDITOR_GADGET5_LEFT_EDGE    EDITOR_GADGET2_LEFT_EDGE
  71. #define EDITOR_GADGET5_TOP_EDGE        (EDITOR_GADGET2_TOP_EDGE + EDITOR_GADGET2_HEIGHT + 5)
  72. #define EDITOR_GADGET5_WIDTH        EDITOR_GADGET2_WIDTH
  73. #define EDITOR_GADGET5_HEIGHT        EDITOR_GADGET2_HEIGHT
  74. #define EDITOR_GADGET5_TEXT        "_Delete"
  75. #define EDITOR_GADGET5_TEXT_ATTR    &topaz80_attr
  76.  
  77. #define EDITOR_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  78. #define EDITOR_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  79. #define EDITOR_GADGET6_LEFT_EDGE    EDITOR_GADGET3_LEFT_EDGE
  80. #define EDITOR_GADGET6_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  81. #define EDITOR_GADGET6_WIDTH        EDITOR_GADGET2_WIDTH
  82. #define EDITOR_GADGET6_HEIGHT        EDITOR_GADGET2_HEIGHT
  83. #define EDITOR_GADGET6_TEXT        "_Edit"
  84. #define EDITOR_GADGET6_TEXT_ATTR    &topaz80_attr
  85.  
  86. #define EDITOR_GADGET7_TYPE        GADGET_DATA_TYPE_BUTTON
  87. #define EDITOR_GADGET7_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  88. #define EDITOR_GADGET7_LEFT_EDGE    EDITOR_GADGET4_LEFT_EDGE
  89. #define EDITOR_GADGET7_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  90. #define EDITOR_GADGET7_WIDTH        EDITOR_GADGET2_WIDTH
  91. #define EDITOR_GADGET7_HEIGHT        EDITOR_GADGET2_HEIGHT
  92. #define EDITOR_GADGET7_TEXT        "_Use"
  93. #define EDITOR_GADGET7_TEXT_ATTR    &topaz80_attr
  94.  
  95. #define EDITOR_GADGET8_TYPE        GADGET_DATA_TYPE_LISTVIEW
  96. #define EDITOR_GADGET8_FLAGS        GADGET_DATA_FLAG_HOTKEY
  97. #define EDITOR_GADGET8_LEFT_EDGE    10
  98. #define EDITOR_GADGET8_TOP_EDGE        (EDITOR_GADGET1_TOP_EDGE + EDITOR_GADGET1_HEIGHT + 19)
  99. #define EDITOR_GADGET8_WIDTH        242
  100. #define EDITOR_GADGET8_HEIGHT        70
  101. #define EDITOR_GADGET8_TEXT        "Defined Tem_plates"
  102. #define EDITOR_GADGET8_TEXT_ATTR    &topaz80_attr
  103. #define EDITOR_GADGET8_SPACING        0
  104. #define EDITOR_GADGET8_TOP        1
  105. #define EDITOR_GADGET8_LIST        NULL
  106.  
  107.     /* Statics & globals for editor main gadgets */
  108.  
  109. BYTE *template_type_text_array[] = {
  110.     "Border", "Text", "Button", "Check", "Radio", "String", "Integer",
  111.     "Slider", "Scroller", "Cycle", "Count", "Listview", "Palette", NULL
  112. };
  113. STATIC struct GadgetData  editor_gadget_data[] = {
  114.    {
  115.     EDITOR_GADGET1_TYPE,        /* gd_Type */
  116.     EDITOR_GADGET1_FLAGS,        /* gd_Flags */
  117.     EDITOR_GADGET1_LEFT_EDGE,    /* gd_LeftEdge */
  118.     EDITOR_GADGET1_TOP_EDGE,    /* gd_TopEdge */
  119.     EDITOR_GADGET1_WIDTH,        /* gd_Width */
  120.     EDITOR_GADGET1_HEIGHT,        /* gd_Height */
  121.     EDITOR_GADGET1_TEXT,        /* *gd_Text */
  122.     EDITOR_GADGET1_TEXT_ATTR,    /* *gd_TextAttr */
  123.     {
  124.     0,                /* gd_CyclePad */
  125.     EDITOR_GADGET1_ACTIVE,        /* gd_CycleActive */
  126.     EDITOR_GADGET1_TEXT_ARRAY    /* gd_CycleTextArray */
  127.     }
  128.    }, {
  129.     EDITOR_GADGET2_TYPE,        /* gd_Type */
  130.     EDITOR_GADGET2_FLAGS,        /* gd_Flags */
  131.     EDITOR_GADGET2_LEFT_EDGE,    /* gd_LeftEdge */
  132.     EDITOR_GADGET2_TOP_EDGE,    /* gd_TopEdge */
  133.     EDITOR_GADGET2_WIDTH,        /* gd_Width */
  134.     EDITOR_GADGET2_HEIGHT,        /* gd_Height */
  135.     EDITOR_GADGET2_TEXT,        /* *gd_Text */
  136.     EDITOR_GADGET2_TEXT_ATTR,    /* *gd_TextAttr */
  137.     { 0, 0, 0 }
  138.    }, {
  139.     EDITOR_GADGET3_TYPE,        /* gd_Type */
  140.     EDITOR_GADGET3_FLAGS,        /* gd_Flags */
  141.     EDITOR_GADGET3_LEFT_EDGE,    /* gd_LeftEdge */
  142.     EDITOR_GADGET3_TOP_EDGE,    /* gd_TopEdge */
  143.     EDITOR_GADGET3_WIDTH,        /* gd_Width */
  144.     EDITOR_GADGET3_HEIGHT,        /* gd_Height */
  145.     EDITOR_GADGET3_TEXT,        /* *gd_Text */
  146.     EDITOR_GADGET3_TEXT_ATTR,    /* *gd_TextAttr */
  147.     { 0, 0, 0 }
  148.    }, {
  149.     EDITOR_GADGET4_TYPE,        /* gd_Type */
  150.     EDITOR_GADGET4_FLAGS,        /* gd_Flags */
  151.     EDITOR_GADGET4_LEFT_EDGE,    /* gd_LeftEdge */
  152.     EDITOR_GADGET4_TOP_EDGE,    /* gd_TopEdge */
  153.     EDITOR_GADGET4_WIDTH,        /* gd_Width */
  154.     EDITOR_GADGET4_HEIGHT,        /* gd_Height */
  155.     EDITOR_GADGET4_TEXT,        /* *gd_Text */
  156.     EDITOR_GADGET4_TEXT_ATTR,    /* *gd_TextAttr */
  157.     { 0, 0, 0 }
  158.    }, {
  159.     EDITOR_GADGET5_TYPE,        /* gd_Type */
  160.     EDITOR_GADGET5_FLAGS,        /* gd_Flags */
  161.     EDITOR_GADGET5_LEFT_EDGE,    /* gd_LeftEdge */
  162.     EDITOR_GADGET5_TOP_EDGE,    /* gd_TopEdge */
  163.     EDITOR_GADGET5_WIDTH,        /* gd_Width */
  164.     EDITOR_GADGET5_HEIGHT,        /* gd_Height */
  165.     EDITOR_GADGET5_TEXT,        /* *gd_Text */
  166.     EDITOR_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  167.     { 0, 0, 0 }
  168.    }, {
  169.     EDITOR_GADGET6_TYPE,        /* gd_Type */
  170.     EDITOR_GADGET6_FLAGS,        /* gd_Flags */
  171.     EDITOR_GADGET6_LEFT_EDGE,    /* gd_LeftEdge */
  172.     EDITOR_GADGET6_TOP_EDGE,    /* gd_TopEdge */
  173.     EDITOR_GADGET6_WIDTH,        /* gd_Width */
  174.     EDITOR_GADGET6_HEIGHT,        /* gd_Height */
  175.     EDITOR_GADGET6_TEXT,        /* *gd_Text */
  176.     EDITOR_GADGET6_TEXT_ATTR,    /* *gd_TextAttr */
  177.     { 0, 0, 0 }
  178.    }, {
  179.     EDITOR_GADGET7_TYPE,        /* gd_Type */
  180.     EDITOR_GADGET7_FLAGS,        /* gd_Flags */
  181.     EDITOR_GADGET7_LEFT_EDGE,    /* gd_LeftEdge */
  182.     EDITOR_GADGET7_TOP_EDGE,    /* gd_TopEdge */
  183.     EDITOR_GADGET7_WIDTH,        /* gd_Width */
  184.     EDITOR_GADGET7_HEIGHT,        /* gd_Height */
  185.     EDITOR_GADGET7_TEXT,        /* *gd_Text */
  186.     EDITOR_GADGET7_TEXT_ATTR,    /* *gd_TextAttr */
  187.     { 0, 0, 0 }
  188.    }, {
  189.     EDITOR_GADGET8_TYPE,        /* gd_Type */
  190.     EDITOR_GADGET8_FLAGS,        /* gd_Flags */
  191.     EDITOR_GADGET8_LEFT_EDGE,    /* gd_LeftEdge */
  192.     EDITOR_GADGET8_TOP_EDGE,    /* gd_TopEdge */
  193.     EDITOR_GADGET8_WIDTH,        /* gd_Width */
  194.     EDITOR_GADGET8_HEIGHT,        /* gd_Height */
  195.     EDITOR_GADGET8_TEXT,        /* *gd_Text */
  196.     EDITOR_GADGET8_TEXT_ATTR,    /* *gd_TextAttr */
  197.     {
  198.     EDITOR_GADGET8_SPACING,        /* gd_ListViewSpacing */
  199.     EDITOR_GADGET8_TOP,        /* gd_ListViewTop */
  200.     EDITOR_GADGET8_LIST        /* gd_ListViewList */
  201.     }
  202.    }, {
  203.     INTUISUP_DATA_END        /* mark end of gadget data array */
  204.    }
  205. };
  206.     /* Defines for editor texts */
  207.  
  208. #define EDITOR_TEXT1_TYPE    TEXT_DATA_TYPE_TEXT
  209. #define EDITOR_TEXT1_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  210. #define EDITOR_TEXT1_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE - 8)
  211. #define EDITOR_TEXT1_TOP_EDGE    (EDITOR_GADGET2_TOP_EDGE + (EDITOR_GADGET2_HEIGHT - 8) / 2)
  212. #define EDITOR_TEXT1_TEXT    "Mode"
  213. #define EDITOR_TEXT1_TEXT_ATTR    &topaz80_attr
  214.  
  215. #define EDITOR_TEXT2_TYPE    TEXT_DATA_TYPE_TEXT
  216. #define EDITOR_TEXT2_FLAGS    TEXT_DATA_FLAG_BOLD
  217. #define EDITOR_TEXT2_LEFT_EDGE    EDITOR_GADGET5_LEFT_EDGE
  218. #define EDITOR_TEXT2_TOP_EDGE    (EDITOR_GADGET5_TOP_EDGE + EDITOR_GADGET5_HEIGHT + 10)
  219. #define EDITOR_TEXT2_TEXT    "Template Information:"
  220. #define EDITOR_TEXT2_TEXT_ATTR    &topaz80_attr
  221.  
  222. #define EDITOR_TEXT3_TYPE    TEXT_DATA_TYPE_TEXT
  223. #define EDITOR_TEXT3_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  224. #define EDITOR_TEXT3_LEFT_EDGE    (EDITOR_TEXT2_LEFT_EDGE + 20 + 4 * 8)
  225. #define EDITOR_TEXT3_TOP_EDGE    (EDITOR_TEXT2_TOP_EDGE + 14)
  226. #define EDITOR_TEXT3_TEXT    "Name"
  227. #define EDITOR_TEXT3_TEXT_ATTR    &topaz80_attr
  228.  
  229. #define EDITOR_TEXT4_TYPE    TEXT_DATA_TYPE_TEXT
  230. #define EDITOR_TEXT4_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  231. #define EDITOR_TEXT4_LEFT_EDGE    EDITOR_TEXT3_LEFT_EDGE
  232. #define EDITOR_TEXT4_TOP_EDGE    (EDITOR_TEXT3_TOP_EDGE + 12)
  233. #define EDITOR_TEXT4_TEXT    "Type"
  234. #define EDITOR_TEXT4_TEXT_ATTR    &topaz80_attr
  235.  
  236. #define EDITOR_TEXT5_TYPE    TEXT_DATA_TYPE_TEXT
  237. #define EDITOR_TEXT5_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  238. #define EDITOR_TEXT5_LEFT_EDGE    EDITOR_TEXT4_LEFT_EDGE
  239. #define EDITOR_TEXT5_TOP_EDGE    (EDITOR_TEXT4_TOP_EDGE + 12)
  240. #define EDITOR_TEXT5_TEXT    "Pos"
  241. #define EDITOR_TEXT5_TEXT_ATTR    &topaz80_attr
  242.  
  243. #define EDITOR_TEXT6_TYPE    TEXT_DATA_TYPE_TEXT
  244. #define EDITOR_TEXT6_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  245. #define EDITOR_TEXT6_LEFT_EDGE    EDITOR_TEXT5_LEFT_EDGE
  246. #define EDITOR_TEXT6_TOP_EDGE    (EDITOR_TEXT5_TOP_EDGE + 12)
  247. #define EDITOR_TEXT6_TEXT    "Size"
  248. #define EDITOR_TEXT6_TEXT_ATTR    &topaz80_attr
  249.  
  250.     /* Statics for texts */
  251.  
  252. STATIC struct TextData  editor_text_data[] = {
  253.    {
  254.     EDITOR_TEXT1_TYPE,    /* td_Type */
  255.     EDITOR_TEXT1_FLAGS,    /* td_Flags */
  256.     EDITOR_TEXT1_LEFT_EDGE,    /* td_LeftEdge */
  257.     EDITOR_TEXT1_TOP_EDGE,    /* td_TopEdge */
  258.     EDITOR_TEXT1_TEXT,    /* *td_Text */
  259.     EDITOR_TEXT1_TEXT_ATTR    /* *td_TextAttr */
  260.    }, {
  261.     EDITOR_TEXT2_TYPE,    /* td_Type */
  262.     EDITOR_TEXT2_FLAGS,    /* td_Flags */
  263.     EDITOR_TEXT2_LEFT_EDGE,    /* td_LeftEdge */
  264.     EDITOR_TEXT2_TOP_EDGE,    /* td_TopEdge */
  265.     EDITOR_TEXT2_TEXT,    /* *td_Text */
  266.     EDITOR_TEXT2_TEXT_ATTR    /* *td_TextAttr */
  267.    }, {
  268.     EDITOR_TEXT3_TYPE,    /* td_Type */
  269.     EDITOR_TEXT3_FLAGS,    /* td_Flags */
  270.     EDITOR_TEXT3_LEFT_EDGE,    /* td_LeftEdge */
  271.     EDITOR_TEXT3_TOP_EDGE,    /* td_TopEdge */
  272.     EDITOR_TEXT3_TEXT,    /* *td_Text */
  273.     EDITOR_TEXT3_TEXT_ATTR    /* *td_TextAttr */
  274.    }, {
  275.     EDITOR_TEXT4_TYPE,    /* td_Type */
  276.     EDITOR_TEXT4_FLAGS,    /* td_Flags */
  277.     EDITOR_TEXT4_LEFT_EDGE,    /* td_LeftEdge */
  278.     EDITOR_TEXT4_TOP_EDGE,    /* td_TopEdge */
  279.     EDITOR_TEXT4_TEXT,    /* *td_Text */
  280.     EDITOR_TEXT4_TEXT_ATTR    /* *td_TextAttr */
  281.    }, {
  282.     EDITOR_TEXT5_TYPE,    /* td_Type */
  283.     EDITOR_TEXT5_FLAGS,    /* td_Flags */
  284.     EDITOR_TEXT5_LEFT_EDGE,    /* td_LeftEdge */
  285.     EDITOR_TEXT5_TOP_EDGE,    /* td_TopEdge */
  286.     EDITOR_TEXT5_TEXT,    /* *td_Text */
  287.     EDITOR_TEXT5_TEXT_ATTR    /* *td_TextAttr */
  288.    }, {
  289.     EDITOR_TEXT6_TYPE,    /* td_Type */
  290.     EDITOR_TEXT6_FLAGS,    /* td_Flags */
  291.     EDITOR_TEXT6_LEFT_EDGE,    /* td_LeftEdge */
  292.     EDITOR_TEXT6_TOP_EDGE,    /* td_TopEdge */
  293.     EDITOR_TEXT6_TEXT,    /* *td_Text */
  294.     EDITOR_TEXT6_TEXT_ATTR    /* *td_TextAttr */
  295.    }, {
  296.     INTUISUP_DATA_END    /* mark end of text data array */
  297.    }
  298. };
  299.     /* Defines for information texts */
  300.  
  301. #define INFO_TEXT_LINES        4
  302.  
  303. #define INFO_TEXT_LEFT_EDGE    (EDITOR_TEXT3_LEFT_EDGE + 8)
  304. #define INFO_TEXT_TOP_EDGE    EDITOR_TEXT3_TOP_EDGE
  305. #define INFO_TEXT_TYPE        TEXT_DATA_TYPE_TEXT
  306. #define INFO_TEXT_FLAGS        TEXT_DATA_FLAG_COLOR2
  307. #define INFO_TEXT_ATTR        EDITOR_TEXT3_TEXT_ATTR
  308.  
  309. #define INFO_TEXT_MAX_WIDTH    (EDITOR_WINDOW_WIDTH - INFO_TEXT_LEFT_EDGE)
  310. #define INFO_TEXT_YOFFSET    (EDITOR_TEXT4_TOP_EDGE - EDITOR_TEXT3_TOP_EDGE)
  311.  
  312. #define INFO_LINE_NAME    0
  313. #define INFO_LINE_TYPE    1
  314. #define INFO_LINE_POS    2
  315. #define INFO_LINE_SIZE    3
  316.  
  317.     /* Defines for menu */
  318.  
  319. #define MENU_TEXT_ATTR    &topaz60_attr
  320.  
  321. #define MENU_PROJECT                0
  322. #define    ITEM_PROJECT_WINDOW            0
  323. #define    ITEM_PROJECT_NEW            1
  324. #define    ITEM_PROJECT_LOAD            2
  325. #define    ITEM_PROJECT_APPEND            3
  326. #define    ITEM_PROJECT_SAVE            4
  327. #define    ITEM_PROJECT_SAVE_C            5
  328. #define    ITEM_PROJECT_ABOUT            6
  329. #define    ITEM_PROJECT_QUIT            7
  330.  
  331. #define MENU_EDIT                1
  332. #define    ITEM_EDIT_LOCK            0        
  333. #define    ITEM_EDIT_UNLOCK            1        
  334. #define       SUBITEM_EDIT_UNLOCK_SINGLE    0        
  335. #define       SUBITEM_EDIT_UNLOCK_ALL        1        
  336. #define    ITEM_EDIT_SNAP            2        
  337.  
  338.     /* Statics for menu */
  339.  
  340. STATIC struct MenuData  editor_menu_data[] = {
  341.    {
  342.     MENU_DATA_TYPE_TITLE, 0, "Project"
  343.    }, {
  344.        MENU_DATA_TYPE_ITEM, 0, "Window", "W", 0
  345.    }, {
  346.        MENU_DATA_TYPE_ITEM, 0, "New", "N", 0
  347.    }, {
  348.        MENU_DATA_TYPE_ITEM, 0, "Load", "L", 0
  349.    }, {
  350.        MENU_DATA_TYPE_ITEM, 0, "Append", "P", 0
  351.    }, {
  352.        MENU_DATA_TYPE_ITEM, 0, "Save", "S", 0
  353.    }, {
  354.        MENU_DATA_TYPE_ITEM, 0, "Save as C", "C", 0
  355.    }, {
  356.        MENU_DATA_TYPE_ITEM, 0, "About", "A", 0
  357.    }, {
  358.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_EMPTY_LINE, "Quit", "Q", 0
  359.    }, {
  360.     MENU_DATA_TYPE_TITLE, 0, "Edit"
  361.    }, {
  362.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Lock", "L", 0
  363.    }, {
  364.        MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Unlock", NULL, 0
  365.    }, {
  366.           MENU_DATA_TYPE_SUBITEM, 0, "Single", "U", 0
  367.    }, {
  368.           MENU_DATA_TYPE_SUBITEM, 0, "All", NULL, 0
  369.    }, {
  370.        MENU_DATA_TYPE_ITEM, 0, "Snap", NULL, 0
  371.    }, {
  372.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE | MENU_DATA_FLAG_SELECTED, "1", NULL, ~(1 << 0)
  373.    }, {
  374.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "2", NULL, ~(1 << 1)
  375.    }, {
  376.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "4", NULL, ~(1 << 2)
  377.    }, {
  378.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "6", NULL, ~(1 << 3)
  379.    }, {
  380.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "8", NULL, ~(1 << 4)
  381.    }, {
  382.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "10", NULL, ~(1 << 5)
  383.    }, {
  384.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "12", NULL, ~(1 << 6)
  385.    }, {
  386.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "14", NULL, ~(1 << 7)
  387.    }, {
  388.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "16", NULL, ~(1 << 8)
  389.    }, {
  390.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "18", NULL, ~(1 << 9)
  391.    }, {
  392.           MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "20", NULL, ~(1 << 10)
  393.    }, {
  394.     INTUISUP_DATA_END    /* mark end of menu data */
  395.    }
  396. };
  397.     /* Editor action loop */
  398.  
  399.    SHORT
  400. editor_action_loop(VOID)
  401. {
  402.    BOOL  keepon = TRUE;
  403.    SHORT status = EDITOR_STATUS_NORMAL;
  404.  
  405.    if (!(egl = ICreateGadgets(eri, &editor_gadget_data[0], 0, 0, NULL))) {
  406.       status = EDITOR_ERROR_OUT_OF_MEM;
  407.    } else {
  408.       if (!(eml = ICreateMenu(eri, ewin, &editor_menu_data[0],
  409.                            MENU_TEXT_ATTR, NULL))) {
  410.      status = EDITOR_ERROR_OUT_OF_MEM;
  411.       } else {
  412.      struct TemplateList  *tl = &template_list;
  413.      struct MsgPort       *eup = ewin->UserPort,
  414.                   *pup = pwin->UserPort;
  415.      LONG emask = 1L << eup->mp_SigBit, pmask = 1L << pup->mp_SigBit,
  416.           full_mask = emask | pmask;
  417.  
  418.      /* Init file requesters */
  419.      project_file_requester->fr_Flags2 |= FR2F_LongPath;
  420.      strcpy(project_file_requester->fr_File, DEFAULT_PROJECT_FILE_NAME);
  421.  
  422.      csource_file_requester->fr_FuncFlags |= FRF_DoColor;
  423.      csource_file_requester->fr_Flags2    |= FR2F_LongPath;
  424.      csource_file_requester->fr_Hail       = CSOURCE_SAVE_HAIL_TEXT;
  425.      strcpy(csource_file_requester->fr_File, DEFAULT_CSOURCE_FILE_NAME);
  426.  
  427.      /* Init template list */
  428.      NewList((struct List *)&tl->tl_Fonts);
  429.      NewList((struct List *)&tl->tl_Templates);
  430.      strcpy(&tl->tl_ProjectID[0], DEFAULT_PROJECT_ID);
  431.      change_project_name(tl, DEFAULT_PROJECT_NAME, -1);
  432.  
  433.      /* Set gadget defaults */
  434.      ISetGadgetAttributes(egl, EDITOR_GADGET_TYPE, 0L, 0L,
  435.                  USE_CURRENT_VALUE, (LONG)DEFAULT_TEMPLATE_TYPE,
  436.                          (VOID *)USE_CURRENT_VALUE);
  437.      ISetGadgetAttributes(egl, FIRST_MODE_GADGET + DEFAULT_EDITOR_MODE,
  438.           0L, 0L, 1L, USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  439.      print_project_window_title();
  440.  
  441.      /* Editor main loop */
  442.      do {
  443.         struct Message  *msg;
  444.         SHORT last_status;
  445.  
  446.         /* Remove all IDCMP events from editor and project window */
  447.         while (msg = GetMsg(eup)) {
  448.            ReplyMsg(msg);
  449.         }
  450.         while (msg = GetMsg(pup)) {
  451.            ReplyMsg(msg);
  452.         }
  453.  
  454.         /* Display editor texts and gadgets, start use mode and attach menu */
  455.         IClearWindow(eri, ewin, 0, 0, EDITOR_WINDOW_WIDTH,
  456.                            EDITOR_WINDOW_HEIGHT, 0);
  457.         IDisplayTexts(eri, ewin, &editor_text_data[0], 0, 0, NULL);
  458.         IDisplayGadgets(ewin, egl);
  459.         IAttachMenu(ewin, eml);
  460.         if (editor_mode == EDITOR_MODE_USE) {
  461.            start_gadget_use_mode();
  462.         }
  463.  
  464.         /* Editor IDCMP loop */
  465.         do {
  466.            LONG signals = Wait(full_mask);
  467.  
  468.            if (signals & emask) {
  469.           status = perform_editor_action();
  470.            }
  471.            if (signals & pmask) {
  472.           status = perform_project_action();
  473.            }
  474.         } while (status <= EDITOR_STATUS_NORMAL);
  475.  
  476.         /* Remove editor gadgets, end gadget use mode and remove menu */
  477.         IRemoveGadgets(egl);
  478.         if (editor_mode == EDITOR_MODE_USE) {
  479.            end_gadget_use_mode();
  480.         }
  481.         IRemoveMenu(eml);
  482.  
  483.         /* Perform special action given by status */
  484.         switch (last_status = status) {
  485.            case EDITOR_STATUS_EDIT :
  486.           if (selected_template) {
  487.              status = edit_template_data();
  488.           }
  489.           break;
  490.  
  491.            case EDITOR_STATUS_WINDOW :
  492.           status = change_project_window();
  493.           break;
  494.  
  495.            case EDITOR_STATUS_NEW :
  496.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  497.               ok_cancel_requester(" New ", "Project changed and"
  498.                         " not saved.\\n\\nDo you really"
  499.                  " want to start a new project?") == TRUE) {
  500.              status = new_project(tl,
  501.                      TEMPLATE_LIST_FLAG_DEFAULT_WINDOW);
  502.           }
  503.           break;
  504.  
  505.            case EDITOR_STATUS_LOAD :
  506.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  507.              ok_cancel_requester(" Load ", "Project changed and"
  508.                         " not saved.\\n\\nDo you really"
  509.                   " want to load a new project?") == TRUE) {
  510.              status = load_project(LOAD_MODE_NORMAL);
  511.           }
  512.           break;
  513.  
  514.            case EDITOR_STATUS_APPEND :
  515.           if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  516.                ok_cancel_requester(" Append ", "Project changed and"
  517.                         " not saved.\\n\\nDo you really"
  518.                 " want to append a new project?") == TRUE) {
  519.              status = load_project(LOAD_MODE_APPEND);
  520.           }
  521.           break;
  522.  
  523.            case EDITOR_STATUS_SAVE :
  524.           status = save_project();
  525.           break;
  526.  
  527.            case EDITOR_STATUS_SAVE_C :
  528.           status = save_c_source();
  529.           break;
  530.  
  531.            case EDITOR_STATUS_ABOUT :
  532.           about_requester();
  533.           break;
  534.  
  535.            case EDITOR_ERROR_NO_WINDOW :
  536.           keepon = FALSE;
  537.           break;
  538.         }
  539.         if (last_status == EDITOR_STATUS_WINDOW || last_status ==
  540.            EDITOR_STATUS_NEW || last_status == EDITOR_STATUS_LOAD) {
  541.  
  542.            /* Get user port data from new project window */
  543.            pup       = pwin->UserPort;
  544.            pmask     = 1L << pup->mp_SigBit;
  545.            full_mask = emask | pmask;
  546.         }
  547.         if (status == EDITOR_STATUS_QUIT) {
  548.            if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  549.              ok_cancel_requester(" Quit ", "Project changed and not"
  550.               " saved.\\n\\nDo you really want to quit?") == TRUE) {
  551.           keepon = FALSE;
  552.            }
  553.         }
  554.      } while (keepon == TRUE);
  555.  
  556.      /* Free resources */
  557.      free_template_list(tl);
  558.      IFreeMenu(eml);
  559.       }
  560.       IFreeGadgets(egl);
  561.    }
  562.    return(status);
  563. }
  564.     /* Perform editor action */
  565.  
  566.    STATIC SHORT
  567. perform_editor_action(VOID)
  568. {
  569.    struct MsgPort       *up = ewin->UserPort;
  570.    struct IntuiMessage  *msg;
  571.    SHORT  status = EDITOR_STATUS_NORMAL;
  572.  
  573.    while (msg = IGetMsg(up)) {
  574.       USHORT entry, code = msg->Code;
  575.       LONG   value;
  576.  
  577.       switch (msg->Class) {
  578.      case CLOSEWINDOW :
  579.         status = EDITOR_STATUS_QUIT;
  580.         break;
  581.  
  582.      case ISUP_ID :
  583.         entry = code;
  584.         value = (LONG)msg->IAddress;
  585.         switch (entry) {
  586.            case EDITOR_GADGET_TYPE :
  587.           template_type = value;
  588.           print_project_window_title();
  589.           break;
  590.  
  591.            case EDITOR_GADGET_TEMPLATES :
  592.           clear_template_info();
  593.           if (select_template_by_num(value)) {
  594.              print_template_info();
  595.           }
  596.           break;
  597.  
  598.            default :
  599.           change_editor_mode(entry, value);
  600.           break;
  601.         }
  602.         break;
  603.  
  604.      case MENUPICK :
  605.         while (code != MENUNULL) {
  606.            switch (MENUNUM(code)) {
  607.           case MENU_PROJECT :
  608.              switch (ITEMNUM(code)) {
  609.             case ITEM_PROJECT_WINDOW :
  610.                status = EDITOR_STATUS_WINDOW;
  611.                break;
  612.  
  613.             case ITEM_PROJECT_NEW :
  614.                status = EDITOR_STATUS_NEW;
  615.                break;
  616.  
  617.             case ITEM_PROJECT_LOAD :
  618.                status = EDITOR_STATUS_LOAD;
  619.                break;
  620.  
  621.             case ITEM_PROJECT_APPEND :
  622.                status = EDITOR_STATUS_APPEND;
  623.                break;
  624.  
  625.             case ITEM_PROJECT_SAVE :
  626.                status = EDITOR_STATUS_SAVE;
  627.                break;
  628.  
  629.             case ITEM_PROJECT_SAVE_C :
  630.                status = EDITOR_STATUS_SAVE_C;
  631.                break;
  632.  
  633.             case ITEM_PROJECT_ABOUT :
  634.                status = EDITOR_STATUS_ABOUT;
  635.                break;
  636.  
  637.             case ITEM_PROJECT_QUIT :
  638.                status = EDITOR_STATUS_QUIT;
  639.                break;
  640.              }
  641.              break;
  642.           case MENU_EDIT :
  643.              switch (ITEMNUM(code)) {
  644.             case ITEM_EDIT_SNAP :
  645.                snap_offset = snap_offset_table[SUBNUM(code)];
  646.                break;
  647.              }
  648.              break;
  649.            }
  650.            code = IMenuItemAddress(eml, code)->NextSelect;
  651.         }
  652.         break;
  653.       }
  654.       IReplyMsg(msg);
  655.    }
  656.    return(status);
  657. }
  658.     /* Change editor mode */
  659.  
  660.    STATIC VOID
  661. change_editor_mode(USHORT gadget, LONG value)
  662. {
  663.    UBYTE  new_mode = gadget - FIRST_MODE_GADGET;
  664.    USHORT active_mode_gadget = editor_mode + FIRST_MODE_GADGET;
  665.  
  666.    if (gadget == active_mode_gadget) {
  667.  
  668.       /* If active mode gadget deselected so select it again */
  669.       ISetGadgetAttributes(egl, gadget, 0L, 0L, 1L, USE_CURRENT_VALUE,
  670.                          (VOID *)USE_CURRENT_VALUE);
  671.    } else {
  672.  
  673.       /* Deselect active mode gadget and set new editor mode */
  674.       ISetGadgetAttributes(egl, active_mode_gadget, 0L, 0L, 0L,
  675.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  676.  
  677.       /* Toggle gadget use mode */
  678.       if (new_mode == EDITOR_MODE_USE) {
  679.      start_gadget_use_mode();
  680.       } else {
  681.      if (editor_mode == EDITOR_MODE_USE) {
  682.         end_gadget_use_mode();
  683.      }
  684.       }
  685.       editor_mode = new_mode;
  686.       print_project_window_title();
  687.    }
  688. }
  689.     /* Print infos about current selected template info */
  690.  
  691.    VOID
  692. print_template_info(VOID)
  693. {
  694.    struct Template  *tp = selected_template;
  695.    USHORT i, top_edge = INFO_TEXT_TOP_EDGE;
  696.  
  697.    /* First clear old info texts */
  698.    if (info_displayed == TRUE) {
  699.       IClearWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  700.          INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  701.                           INFO_TEXT_YOFFSET - 1, 0);
  702.       draw_box_with_border(pwin, &info_template->tp_Box);
  703.    }
  704.  
  705.    /* Now print new info texts */
  706.    for (i = 0; i < INFO_TEXT_LINES; i++) {
  707.       BYTE text[80];
  708.  
  709.       switch (i) {
  710.      case INFO_LINE_NAME :
  711.         SPrintf(&text[0], "%s", &tp->tp_TemplateName[0]);
  712.         break;
  713.  
  714.      case INFO_LINE_TYPE :
  715.         SPrintf(&text[0], "%s", template_type_text_array[tp->tp_Type]);
  716.         break;
  717.  
  718.      case INFO_LINE_POS :
  719.         SPrintf(&text[0], "%d,%d", tp->tp_Box.bo_X1, tp->tp_Box.bo_Y1);
  720.         break;
  721.  
  722.      case INFO_LINE_SIZE :
  723.         SPrintf(&text[0], "%dx%d", tp->tp_Box.bo_X2 - tp->tp_Box.bo_X1 +
  724.                 1, tp->tp_Box.bo_Y2 - tp->tp_Box.bo_Y1 + 1);
  725.         break;
  726.       }
  727.       IPrintText(eri, ewin, &text[0], INFO_TEXT_LEFT_EDGE, top_edge,
  728.                INFO_TEXT_TYPE, INFO_TEXT_FLAGS, INFO_TEXT_ATTR);
  729.       top_edge += INFO_TEXT_YOFFSET;
  730.    }
  731.    draw_box_with_border(pwin, &tp->tp_Box);
  732.    info_template  = tp;
  733.    info_displayed = TRUE;
  734. }
  735.     /* Clear template info */
  736.  
  737.    VOID
  738. clear_template_info(VOID)
  739. {
  740.    if (info_displayed == TRUE) {
  741.       IClearWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  742.          INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  743.                           INFO_TEXT_YOFFSET - 1, 0);
  744.       draw_box_with_border(pwin, &info_template->tp_Box);
  745.       info_template  = NULL;
  746.       info_displayed = FALSE;
  747.    }
  748. }
  749.     /* Start gadget use mode */
  750.  
  751.    VOID
  752. start_gadget_use_mode(VOID)
  753. {
  754.    struct TemplateList  *tl = &template_list;
  755.    USHORT num = tl->tl_GadgetTemplates;
  756.    SHORT  status = EDITOR_STATUS_NORMAL;
  757.  
  758.    if (num) {
  759.       struct GadgetData  *gd;
  760.  
  761.       if (!(use_gd = gd = AllocMem((LONG)(num + 1) *
  762.                sizeof(struct GadgetData), (LONG)MEMF_PUBLIC))) {
  763.      status = EDITOR_ERROR_OUT_OF_MEM;
  764.       } else {
  765.      struct Template  *tp;
  766.  
  767.      for (tp = get_head((struct List *)&tl->tl_Templates); tp;
  768.                           tp = get_succ(&tp->tp_Node)) {
  769.         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET) {
  770.            CopyMem((BYTE *)&tp->tp_Data.tp_GadgetData, (BYTE *)gd++,
  771.                        (LONG)sizeof(struct GadgetData));
  772.         }
  773.      }
  774.      gd->gd_Type = INTUISUP_DATA_END;   /* mark end of gadget data array */
  775.      if (!(use_gl = ICreateGadgets(pri, use_gd, 0, 0, NULL))) {
  776.         FreeMem(use_gd, (LONG)(num + 1) * sizeof(struct GadgetData));
  777.         status = EDITOR_ERROR_OUT_OF_MEM;
  778.          } else {
  779.         IDisplayGadgets(pwin, use_gl);
  780.          }
  781.       }
  782.       show_error(status);
  783.    }
  784. }
  785.     /* End gadget use mode */
  786.  
  787.    VOID
  788. end_gadget_use_mode(VOID)
  789. {
  790.    USHORT num = template_list.tl_GadgetTemplates;
  791.  
  792.    if (num) {
  793.       IRemoveGadgets(use_gl);
  794.       IFreeGadgets(use_gl);
  795.       FreeMem(use_gd, (LONG)(num + 1) * sizeof(struct GadgetData));
  796.    }
  797. }
  798.